<?php

// 层数
$num_layers = 3;
// 第1层特征数
$num_n1 = 4;
// 第2层特征数
$num_n2 = 3;
// 第3层特征数
$num_n3 = 3;
// 创建标准反向传播神经网络
$fann = fann_create_standard($num_layers, $num_n1, $num_n2, $num_n3);
// 设置隐藏层激活函数为 sigmoid
fann_set_activation_function_hidden($fann, FANN_SIGMOID);
// 设置输出层激活函数为 sigmoid
fann_set_activation_function_output($fann, FANN_SIGMOID);
// 设置训练停止函数为 均方差
fann_set_train_stop_function($fann, FANN_STOPFUNC_MSE);
// 设置训练算法为每次求均方差后更新权重
fann_set_training_algorithm($fann, FANN_TRAIN_BATCH);
// 训练次数
$iter = 1000;
// 用户函数，无
$userFunc = 0;
// 误差小于 $stopError 时停止训练
$stopError = 1E-6;
// 由数据文件进行训练,
fann_train_on_file($fann, 'iris-4-train.data', $iter, $userFunc, $stopError);
// 保存网络
fann_save($fann, 'fann.net');
// 读测试数据
$x = fopen('iris-4-test-x.data', 'r');
// 运行测试
$hat = [];
while ($arr = fgetcsv($x)) {
    $output = fann_run($fann, $arr);
    arsort($output);
    $hat[] = array_keys($output)[0];
}
fclose($x);

// 输出预测值
echo join($hat, ","), PHP_EOL;

/*
 * output:
 * 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2
 */

// 销毁网络
fann_destroy($fann);
